package Implementacion;

import Entidades.Barco;
import Entidades.Orientacion;
import Entidades.Tablero;
import Implementaciones.Vector;
import Interfaces.BatallaNavalInterface;
import TDA.ConjuntoTDA;
import TDA.VectorTDA;

public class BatallaNaval implements BatallaNavalInterface {

	@Override
	public void resolverBatallaNaval(ConjuntoTDA<Barco> barcos, Tablero tablero) {		
		
		Vector<Barco> v = new Vector<Barco>();
		v.inicializarVector(tablero.obtenerDimensionTablero());
		int i = 0;
		while(!barcos.conjuntoVacio()){
			Barco b = barcos.elegir();
			try {
				v.agregarElemento(i, b);
			} catch (Exception e) {
				e.printStackTrace();
			}
			barcos.sacar(b);
			i++;
		}

		this.BN(v,0,tablero);				
	}
	
	private boolean BN (VectorTDA<Barco> barcos, int etapa, Tablero tablero){

		if(barcos.capacidadVector() == etapa){
			if(tablero.validarPosYSuma()){
				tablero.imprimirTablero();
				return true;
			}
			return false;
		}
		else{
			for(int fila = 0;fila<tablero.obtenerDimensionTablero();fila++){
				for(int col = 0;col<tablero.obtenerDimensionTablero();col++){
					try {
						Barco b = barcos.recuperarElemento(etapa);
						if(b.obtenerCantidadCeldas()==1){ // tiene solo una celda de longitud, no vale la pena probar las dos orientaciones.
							b.setearOrientacion(Orientacion.Horizontal);//seteo cualquier orientacion, total es lo mismo.
							if(tablero.setearBarco(fila, col, b)){
								if(tablero.validarPosicionesDeBarcos()){
									BN(barcos,etapa+1,tablero);
								}
								tablero.quitarBarco(fila,col,b);
							}
						}
						else{
							for(Orientacion ori : Orientacion.values()){
								b.setearOrientacion(ori);
								if(tablero.setearBarco(fila, col, b)){
									if(tablero.validarPosicionesDeBarcos()){
										BN(barcos,etapa+1,tablero);
									}
									tablero.quitarBarco(fila,col,b);
								}
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
		return false;
	}
	
	
	
	
}
